package com.hxjr.dialog;

import android.app.Dialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.Transformation;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

public class SweetAlertDialog extends Dialog implements View.OnClickListener
{
	private View mDialogView;
	private AnimationSet mModalInAnim;
	private AnimationSet mModalOutAnim;
	private Animation mOverlayOutAnim;
	private Animation mErrorInAnim;
	private AnimationSet mErrorXInAnim;
	private AnimationSet mSuccessLayoutAnimSet;
	private Animation mSuccessBowAnim;
	private TextView mTitleTextView;
	private TextView mContentTextView;
	private String mTitleText;
	private String mContentText;
	private boolean mShowCancel;
	private boolean mShowContent;
	private String mCancelText;
	private String mConfirmText;
	private int mAlertType;
	private FrameLayout mErrorFrame;
	private FrameLayout mSuccessFrame;
	private FrameLayout mProgressFrame;
	private SuccessTickView mSuccessTick;
	private ImageView mErrorX;
	private View mSuccessLeftMask;
	private View mSuccessRightMask;
	private Drawable mCustomImgDrawable;
	private ImageView mCustomImage;
	private TextView mConfirmButton;
	private TextView mCancelButton;
    private View mLineBetween;
    private View mLineFoot;
	private ProgressHelper mProgressHelper;
	private FrameLayout mWarningFrame;
	private OnSweetClickListener mCancelClickListener;
	private OnSweetClickListener mConfirmClickListener;
	private boolean mCloseFromCancel;

	public static final int NORMAL_TYPE = 0;
	public static final int ERROR_TYPE = 1;
	public static final int SUCCESS_TYPE = 2;
	public static final int WARNING_TYPE = 3;
	public static final int CUSTOM_IMAGE_TYPE = 4;
	public static final int PROGRESS_TYPE = 5;

	public static interface OnSweetClickListener
	{
		public void onClick(SweetAlertDialog sweetAlertDialog);
	}

	public SweetAlertDialog(Context context)
	{
		this(context, NORMAL_TYPE);
	}

	public SweetAlertDialog(Context context, int alertType)
	{
		super(context, R.style.alert_dialog);
		setCancelable(true);
		setCanceledOnTouchOutside(false);
		mProgressHelper = new ProgressHelper(context);
		mAlertType = alertType;
		mErrorInAnim = OptAnimationLoader.loadAnimation(getContext(),
				R.anim.error_frame_in);
		mErrorXInAnim = (AnimationSet) OptAnimationLoader.loadAnimation(
				getContext(), R.anim.error_x_in);
		// 2.3.x system don't support alpha-animation on layer-list drawable
		// remove it from animation set
		if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1)
		{
			List<Animation> childAnims = mErrorXInAnim.getAnimations();
			int idx = 0;
			for (; idx < childAnims.size(); idx++)
			{
				if (childAnims.get(idx) instanceof AlphaAnimation)
				{
					break;
				}
			}
			if (idx < childAnims.size())
			{
				childAnims.remove(idx);
			}
		}
		mSuccessBowAnim = OptAnimationLoader.loadAnimation(getContext(),
				R.anim.success_bow_roate);
		mSuccessLayoutAnimSet = (AnimationSet) OptAnimationLoader
				.loadAnimation(getContext(), R.anim.success_mask_layout);
		mModalInAnim = (AnimationSet) OptAnimationLoader.loadAnimation(
				getContext(), R.anim.modal_in);
		mModalOutAnim = (AnimationSet) OptAnimationLoader.loadAnimation(
				getContext(), R.anim.modal_out);
		mModalOutAnim.setAnimationListener(new Animation.AnimationListener()
		{
			@Override
			public void onAnimationStart(Animation animation)
			{

			}

			@Override
			public void onAnimationEnd(Animation animation)
			{
				mDialogView.setVisibility(View.GONE);
				mDialogView.post(new Runnable()
				{
					@Override
					public void run()
					{
						if (mCloseFromCancel)
						{
							SweetAlertDialog.super.cancel();
						} else
						{
							SweetAlertDialog.super.dismiss();
						}
					}
				});
			}

			@Override
			public void onAnimationRepeat(Animation animation)
			{

			}
		});
		// dialog overlay fade out
		mOverlayOutAnim = new Animation()
		{
			@Override
			protected void applyTransformation(float interpolatedTime,
					Transformation t)
			{
				WindowManager.LayoutParams wlp = getWindow().getAttributes();
				wlp.alpha = 1 - interpolatedTime;
				getWindow().setAttributes(wlp);
			}
		};
		mOverlayOutAnim.setDuration(120);
	}

	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.alert_dialog);

		mDialogView = getWindow().getDecorView().findViewById(
				android.R.id.content);
		mTitleTextView = (TextView) findViewById(R.id.title_text);
		mContentTextView = (TextView) findViewById(R.id.content_text);
		mErrorFrame = (FrameLayout) findViewById(R.id.error_frame);
		mErrorX = (ImageView) mErrorFrame.findViewById(R.id.error_x);
		mSuccessFrame = (FrameLayout) findViewById(R.id.success_frame);
		mProgressFrame = (FrameLayout) findViewById(R.id.progress_dialog);
		mSuccessTick = (SuccessTickView) mSuccessFrame
				.findViewById(R.id.success_tick);
		mSuccessLeftMask = mSuccessFrame.findViewById(R.id.mask_left);
		mSuccessRightMask = mSuccessFrame.findViewById(R.id.mask_right);
		mCustomImage = (ImageView) findViewById(R.id.custom_image);
		mWarningFrame = (FrameLayout) findViewById(R.id.warning_frame);
		mConfirmButton = (TextView) findViewById(R.id.confirm_button);
        mLineFoot = findViewById(R.id.line_foot);
        mCancelButton = (TextView) findViewById(R.id.cancel_button);
        mLineBetween = findViewById(R.id.line_between_cancel_confirm);

		mProgressHelper
				.setProgressWheel((ProgressWheel) findViewById(R.id.progressWheel));
		mConfirmButton.setOnClickListener(this);
		mCancelButton.setOnClickListener(this);

		setTitleText(mTitleText);
		setContentText(mContentText);
		setCancelText(mCancelText);
		setConfirmText(mConfirmText);
		changeAlertType(mAlertType, true);

	}

	private void restore()
	{
		mCustomImage.setVisibility(View.GONE);
		mErrorFrame.setVisibility(View.GONE);
		mSuccessFrame.setVisibility(View.GONE);
		mWarningFrame.setVisibility(View.GONE);
		mProgressFrame.setVisibility(View.GONE);
		mConfirmButton.setVisibility(View.VISIBLE);
        mLineFoot.setVisibility(View.VISIBLE);

		mConfirmButton.setBackgroundResource(R.drawable.selector_dialog_bottom_btn_bg);
		mErrorFrame.clearAnimation();
		mErrorX.clearAnimation();
		mSuccessTick.clearAnimation();
		mSuccessLeftMask.clearAnimation();
		mSuccessRightMask.clearAnimation();
	}

	private void playAnimation()
	{
		if (mAlertType == ERROR_TYPE)
		{
			mErrorFrame.startAnimation(mErrorInAnim);
			mErrorX.startAnimation(mErrorXInAnim);
		} else if (mAlertType == SUCCESS_TYPE)
		{
			mSuccessTick.startTickAnim();
			mSuccessRightMask.startAnimation(mSuccessBowAnim);
		}
	}

	private void changeAlertType(int alertType, boolean fromCreate)
	{
		mAlertType = alertType;
		// call after created views
		if (mDialogView != null)
		{
			if (!fromCreate)
			{
				// restore all of views state before switching alert type
				restore();
			}
			switch (mAlertType)
			{
			case ERROR_TYPE:
				mErrorFrame.setVisibility(View.VISIBLE);
				break;
			case SUCCESS_TYPE:
				mSuccessFrame.setVisibility(View.VISIBLE);
				// initial rotate layout of success mask
				mSuccessLeftMask.startAnimation(mSuccessLayoutAnimSet
						.getAnimations().get(0));
				mSuccessRightMask.startAnimation(mSuccessLayoutAnimSet
						.getAnimations().get(1));
				break;
			case WARNING_TYPE:
				//mConfirmButton.setBackgroundResource(R.drawable.red_button_background);
				mConfirmButton.setBackgroundResource(R.drawable.selector_dialog_bottom_btn_bg);
				mWarningFrame.setVisibility(View.VISIBLE);
				break;
			case CUSTOM_IMAGE_TYPE:
				setCustomImage(mCustomImgDrawable);
				break;
			case PROGRESS_TYPE:
				mProgressFrame.setVisibility(View.VISIBLE);
				mConfirmButton.setVisibility(View.GONE);
                mLineFoot.setVisibility(View.GONE);
				break;
			}
			if (!fromCreate)
			{
				playAnimation();
			}
		}
	}

	public int getAlerType()
	{
		return mAlertType;
	}

	public void changeAlertType(int alertType)
	{
		changeAlertType(alertType, false);
	}

	public String getTitleText()
	{
		return mTitleText;
	}

	public SweetAlertDialog setTitleText(String text)
	{
		mTitleText = text;
		if (mTitleTextView != null && mTitleText != null)
		{
			mTitleTextView.setText(mTitleText);
		}
		return this;
	}

	public SweetAlertDialog setCustomImage(Drawable drawable)
	{
		mCustomImgDrawable = drawable;
		if (mCustomImage != null && mCustomImgDrawable != null)
		{
			mCustomImage.setVisibility(View.VISIBLE);
			mCustomImage.setImageDrawable(mCustomImgDrawable);
		}
		return this;
	}

	public SweetAlertDialog setCustomImage(int resourceId)
	{
		return setCustomImage(getContext().getResources().getDrawable(
				resourceId));
	}

	public String getContentText()
	{
		return mContentText;
	}

	public SweetAlertDialog setContentText(String text)
	{
		mContentText = text;
		if (mContentTextView != null && mContentText != null)
		{
			showContentText(true);
			mContentTextView.setText(mContentText);
		}
		return this;
	}

	public boolean isShowCancelButton()
	{
		return mShowCancel;
	}

	public SweetAlertDialog showCancelButton(boolean isShow)
	{
		mShowCancel = isShow;
		if (mCancelButton != null)
		{
			mCancelButton.setVisibility(mShowCancel ? View.VISIBLE : View.GONE);

            //同时也显示中间分割线
            if(mLineBetween != null){
                mLineBetween.setVisibility(mShowCancel ? View.VISIBLE : View.GONE);
            }
            //改变确认按钮 背景
            if(mConfirmButton != null){
                mConfirmButton.setBackgroundDrawable(getContext().getResources().getDrawable(R.drawable.selector_dialog_right_btn_bg));
            }
		}
		return this;
	}

	public boolean isShowContentText()
	{
		return mShowContent;
	}

	public SweetAlertDialog showContentText(boolean isShow)
	{
		mShowContent = isShow;
		if (mContentTextView != null)
		{
			mContentTextView.setVisibility(mShowContent ? View.VISIBLE
					: View.GONE);
		}
		return this;
	}

	public String getCancelText()
	{
		return mCancelText;
	}

	public SweetAlertDialog setCancelText(String text)
	{
		mCancelText = text;
		if (mCancelButton != null && mCancelText != null)
		{
			showCancelButton(true);
			mCancelButton.setText(mCancelText);
		}
		return this;
	}

	public String getConfirmText()
	{
		return mConfirmText;
	}

	public SweetAlertDialog setConfirmText(String text)
	{
		mConfirmText = text;
		if (mConfirmButton != null && mConfirmText != null)
		{
			mConfirmButton.setText(mConfirmText);
		}
		return this;
	}

	public SweetAlertDialog setCancelClickListener(OnSweetClickListener listener)
	{
		mCancelClickListener = listener;
		return this;
	}

	public SweetAlertDialog setConfirmClickListener(
			OnSweetClickListener listener)
	{
		mConfirmClickListener = listener;
		return this;
	}

	protected void onStart()
	{
		mDialogView.startAnimation(mModalInAnim);
		playAnimation();
	}

	/**
	 * The real Dialog.cancel() will be invoked async-ly after the animation
	 * finishes.
	 */
	@Override
	public void cancel()
	{
		dismissWithAnimation(true);
	}

	/**
	 * The real Dialog.dismiss() will be invoked async-ly after the animation
	 * finishes.
	 */
	public void dismissWithOutAnimation()
	{
		dismissWithAnimation(false);
	}

	private void dismissWithAnimation(boolean fromCancel)
	{
		mCloseFromCancel = fromCancel;
		mConfirmButton.startAnimation(mOverlayOutAnim);
		mDialogView.startAnimation(mModalOutAnim);
	}

	@Override
	public void onClick(View v)
	{
		if (v.getId() == R.id.cancel_button)
		{
			if (mCancelClickListener != null)
			{
				mCancelClickListener.onClick(SweetAlertDialog.this);
			} else
			{
				dismissWithOutAnimation();
			}
		} else if (v.getId() == R.id.confirm_button)
		{
			if (mConfirmClickListener != null)
			{
				mConfirmClickListener.onClick(SweetAlertDialog.this);
			} else
			{
				dismissWithOutAnimation();
			}
		}
	}

	public ProgressHelper getProgressHelper()
	{
		return mProgressHelper;
	}
}